Application Load Balancer(ALB)でAuto Scaling Groupを登録する(CLIのみ)
ウィスキー、シガー、パイプをこよなく愛する大栗です。
先日ALBの発表エントリーを書いたのですが、調査している中でManagement Consoleを見ていてもALBにAuto Scaling Groupを登録する機能が無いように(Auto Scalingも登録で旧ELBしか選択できない)見受けられました。しかし公式ブログには以下のような記載がありAuto Scalingと連携していると書いていました。よく調べてみるとAWS CLIで設定が可能だったので試してみました。(2016年8月15日現在)
アプリケーションロードバランサーはAuto Scaling、Amazon ECS、AWS CloudFormation、AWS CodeDeploy、そしてAWS Certificate Manager (ACM)といった複数のAWSサービスと連携しています。
概要
基本はtarget1
へ向いて、/target/*
はtarget2
へ向く構成をAuto Scaling Groupで構築します。
Auto Scaling Groupを登録する
Launch Configurationを作成する
Launch Configurationを作成します。
まずはas-lc-01
を作成します。UserData用のファイルを作成します。
$ cat << EOF > ./target1.txt > #!/bin/bash > yum install -y httpd > echo target1 > /var/www/html/index.html > curl -s http://169.254.169.254/latest/meta-data/instance-id >> /var/www/html/index.html > service httpd start > EOF
Launch Configurationを作成します。
aws autoscaling create-launch-configuration --launch-configuration-name as-lc-01 --image-id ami-374db956 --user-data file://target1.txt --instance-type t2.micro \ --key-name <KeyName> --security-groups <SerurityGroupName> --iam-instance-profile <RoleName>
次にas-lc-02
を作成します。UserData用のファイルを作成します。
$ cat << EOF > ./target2.txt > #!/bin/bash > yum install -y httpd > curl -s http://169.254.169.254/latest/meta-data/instance-id >> /var/www/html/index.html > echo /target/target2 > /var/www/html/target/index.html > curl -s http://169.254.169.254/latest/meta-data/instance-id >> /var/www/html/target/index.html > service httpd start > EOF
Launch Configurationを作成します。
aws autoscaling create-launch-configuration --launch-configuration-name as-lc-02 --image-id ami-374db956 --user-data file://target2.txt --instance-type t2.micro \ --key-name <KeyName> --security-groups <SerurityGroupName> --iam-instance-profile <RoleName>
Auto Scaling Groupを作成する
asg01
を作成します。これはas-lc-01
を使用して作成します。ここで--target-group-arns
オプションを使ってALBのターゲットグループを指定する事もできますが、今回は指定しません。なお、aws autoscaling update-auto-scaling-group
コマンドにはターゲットグループを指定する守オプションがないため一度作成するとAuto Scaling Group側からはALBを指定できません。
aws autoscaling create-auto-scaling-group --auto-scaling-group-name asg01 --launch-configuration-name as-lc-01 --min-size 0 --max-size 4 --desired-capacity 2 \ --vpc-zone-identifier <Sunbent1>,<<Sunbent2>
asg02
を作成します。これはas-lc-02
を使用して作成します。
aws autoscaling create-auto-scaling-group --auto-scaling-group-name asg02 --launch-configuration-name as-lc-02 --min-size 0 --max-size 4 --desired-capacity 2 \ --vpc-zone-identifier <Sunbent1>,<<Sunbent2>
Target Groupを作成する
ここではインスタンス等が無い空っぽのターゲットグループを作成します。
target1
を作成します。
$ aws elbv2 create-target-group --name target1 --protocol HTTP --port 80 --vpc-id <VPC-ID> \ > --health-check-protocol HTTP --health-check-port traffic-port --health-check-path '/index.html' { "TargetGroups": [ { "HealthCheckPath": "/index.html", "HealthCheckIntervalSeconds": 30, "VpcId": "VPC-ID", "Protocol": "HTTP", "HealthCheckTimeoutSeconds": 5, "HealthCheckProtocol": "HTTP", "UnhealthyThresholdCount": 2, "HealthyThresholdCount": 5, "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target1/12345678abcdefgh", "Matcher": { "HttpCode": "200" }, "HealthCheckPort": "traffic-port", "Port": 80, "TargetGroupName": "target1" } ] }
target2
を作成します。
$ aws elbv2 create-target-group --name target2 --protocol HTTP --port 80 --vpc-id <VPC-ID> \ > --health-check-protocol HTTP --health-check-port traffic-port --health-check-path '/index.html' { "TargetGroups": [ { "HealthCheckPath": "/index.html", "HealthCheckIntervalSeconds": 30, "VpcId": "VPC-ID", "Protocol": "HTTP", "HealthCheckTimeoutSeconds": 5, "HealthCheckProtocol": "HTTP", "UnhealthyThresholdCount": 2, "HealthyThresholdCount": 5, "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target2/12345678abcdefgh", "Matcher": { "HttpCode": "200" }, "HealthCheckPort": "traffic-port", "Port": 80, "TargetGroupName": "target2" } ] }
ALBを作成する
ALBを作成します。
$ aws elbv2 create-load-balancer --name alb01 --scheme internet-facing \ > --subnets <Subnet1> <Subnet2> --security-groups <SecurityGroup1> <SecurityGroup2> { "LoadBalancers": [ { "VpcId": "vpc-6639da03", "LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/alb01/12345678abcdefgh", "State": { "Code": "provisioning" }, "DNSName": "alb01-123456789.ap-northeast-1.elb.amazonaws.com", "SecurityGroups": [ "sg-aaaaaaaa", "sg-bbbbbbbb" ], "LoadBalancerName": "alb01", "CreatedTime": "2016-08-14T13:18:59.050Z", "Scheme": "internet-facing", "Type": "application", "CanonicalHostedZoneId": "ABCD1234EFG56", "AvailabilityZones": [ { "SubnetId": "subnet-11111111", "ZoneName": "ap-northeast-1c" }, { "SubnetId": "subnet-22222222", "ZoneName": "ap-northeast-1a" } ] } ] }
Lintenerを作成します。--load-balancer-arn
オプションで今作成したALBのARNを指定します。--default-actions
オプションのターゲットグループはtarget1
を指定してみます。
$ aws elbv2 create-listener --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/alb01/12345678abcdefgh --protocol HTTP --port 80 \ > --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target1/12345678abcdefgh { "Listeners": [ { "Protocol": "HTTP", "DefaultActions": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target1/12345678abcdefgh", "Type": "forward" } ], "LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/alb01/12345678abcdefgh", "Port": 80, "ListenerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener/app/alb01/abcdefgh12345678/12345678abcdefgh" } ] }
Ruleを追加します。ここでは/target/*
と時にtarget2
へ向けます。
$ aws elbv2 create-rule --priority 1 --conditions Field=path-pattern,Values='/target/*' \ > --actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target2/12345678abcdefgh { "Rules": [ { "Priority": "1", "Conditions": [ { "Field": "path-pattern", "Values": [ "/target/*" ] } ], "RuleArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener-rule/app/alb01/12345678abcdefgh/abcdefgh12345678/1234abcd5678efgh", "IsDefault": false, "Actions": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target2/12345678abcdefgh", "Type": "forward" } ] } ] }
Auto Scaling Groupを登録します。
ALBへ登録する時にはaws autoscaling attach-load-balancer-target-groups
コマンドを使用します。
asg01
はtarget1
に登録します。
$ aws autoscaling attach-load-balancer-target-groups --auto-scaling-group-name asg01 \ > --target-group-arns arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target1/12345678abcdefgh
asg02
はtarget2
に登録します。
$ aws autoscaling attach-load-balancer-target-groups --auto-scaling-group-name asg02 \ > --target-group-arns arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/target2/12345678abcdefgh
アクセスして確認する
http://alb01-123456789.ap-northeast-1.elb.amazonaws.com/index.html
にアクセスしています。
target1に向いています。
http://alb01-123456789.ap-northeast-1.elb.amazonaws.com/target/index.html
にアクセスしています。
target2に向いています。
さいごに
Managet ConsoleではAuto Scaling Groupの登録はできませんが、CLIであればALBでもAuto Scalin Groupを登録することができます。
しかし、先日紹介したelastic-load-balancing-toolsではAuto Scalin Groupを移行することができないので、本手順を使用して移行してください。